一道关于>>和>>>的题

来源:百度知道 编辑:UC知道 时间:2024/05/27 17:01:58
public class test{
public static void main(String af[]){
int b1=1<<31;
int b2=1<<31;
b1>>>=31;
b1>>>=1;
b2>>=31;
b2>>=1;
System.out.println("b1="+b1+",b2="+b2);
}
}
最后结果是b1=0,b2=-1。
有点不懂,谁能帮忙解释一下,先谢了哈。

关于Shift的题目。。一点一点的分析吧:
b1=1<<31;把b1对应的二进制表达式往左边移动31位,00000000 00000000 00000000 00000001 -〉 10000000 00000000 00000000 00000000
b2和b1值一样。
然后b1>>>=31; 这个等价于b1=b1>>>31; >>>符号是右移,并把top bit,而就是最前面的那个表示数字正负符号的那个bit符号,用0代替。这个步骤结果是00000000 00000000 00000000 00000001
b1>>>=1,得到00000000 00000000 00000000 00000000
b1 = 0;
对于b2,
b2>>=31; >>也是右移,区别是把top bit用之前的bit代替。之前是10000000 00000000 00000000 00000000,top bit(最前面的bit,也就是新加的bit,最右边的被挤掉了) = 1.
得到11111111 11111111 11111111 11111111.(1步1步的移,移31次)
这样就得到b2 = -1了。
下一步b2>>=1; 把b2继续往右边移1位,结果还是11...1,所以结果还是 -1。